package com.xxx.springboot.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * spring 拦截器
 * 拦截器它是链式调用，一个应用中可以同时存在多个拦截器Interceptor， 一个请求也可以触发多个拦截器 ，而每个拦截器的调用会依据它的声明顺序依次执行。
 */
@Component
public class MyInterceptor implements HandlerInterceptor {

	/**
	 * 前置处理
	 * 【执行时机】：这个方法将在请求处理之前进行调用。
	 * 【注意】：如果该方法返回true，才会进入后续处理；否则将视为当前请求结束，不仅自身的拦截器会失效，还会导致其他的拦截器也不再执行。
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
//		System.out.println("MyInterceptor|preHandle 前置处理");
		return true;
	}

	/**
	 * 后置处理
	 * 【执行时机】：在执行handler返回modelAndView之前来执行。
	 * 【执行顺序】：postHandle() 方法被调用的顺序跟 preHandle() 是相反的，先声明的拦截器 preHandle() 方法先执行，而postHandle()方法反而会后执行。
	 * 【注意】：只有在 preHandle() 方法返回值为true 时才会执行。
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
//		System.out.println("MyInterceptor|postHandle 处理中");
	}

	/**
	 * 完成处理
	 * 【执行时机】：在执行完成handler，返回modelAndView之后执行
	 * 【注意】：只有在 preHandle() 方法返回值为true 时才会执行。
	 */
	@Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, 
    		Exception ex) throws Exception {
//        System.out.println("MyInterceptor|afterCompletion 完成处理");
    }
}
